/*
 * Copyright (C) 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.cloud.teleport.v2.transforms;

import com.google.cloud.spanner.Struct;
import com.google.cloud.teleport.v2.templates.SpannerToBigQuery;
import com.google.cloud.teleport.v2.utils.SpannerUtils;
import org.apache.beam.sdk.transforms.MapElements;
import org.apache.beam.sdk.transforms.PTransform;
import org.apache.beam.sdk.transforms.SimpleFunction;
import org.apache.beam.sdk.values.PCollection;

/** Transforms used by {@link SpannerToBigQuery} template. */
public final class SpannerToBigQueryTransform {

  /** Converts {@link Struct} records to JSON string records. */
  public static class StructToJson extends PTransform<PCollection<Struct>, PCollection<String>> {

    @Override
    public PCollection<String> expand(PCollection<Struct> structPCollection) {
      return structPCollection.apply(
          "Struct To Json String",
          MapElements.via(
              new SimpleFunction<Struct, String>() {
                @Override
                public String apply(Struct input) {
                  return SpannerUtils.convertStructToJson(input).toString();
                }
              }));
    }
  }
}
